import json
from django.contrib.auth import login,logout
from django.shortcuts import render,reverse,redirect
from django.views import View
from .forms import RegisterForm,LoginForm
from .models import Users
from utils.json_fun import to_json_data
from utils.res_code import Code, error_map
from django.db.models import Q # Q查询
# Create your views here.


# 注册的视图类
class RegisterView(View):
    """"/register/"""
    # 一般我们会在类视图开始的地方写一些注释
    # 类视图中会先写是哪个url路径来访问这个类视图
    def get(self,request):
        return render(request, 'users/register.html')

    # 思考:
    # 1.发送的参数 用户名 密码 确认密码 手机号 手机短信验证码  2.请求方式 post
    # 3.提交参数的方式 ajax提交(我们用ajax) form表单提交  4.获取数据 校验数据
    # 校验数据 1.用户名 不能为空 格式是否正确 是否注册过
    # 2.密码和确认密码中的内容一致
    # 3.手机号 不能为空 格式是否正确 是否注册过
    # 4.手机短信验证码 不为空 与数据库中存入的数据一样

    def post(self,request):
        # 步骤 1.获取参数
        json_data = request.body
        if not json_data: # 判断是否有数据
            return to_json_data(errno=Code.PARAMERR,
                                errmsg=error_map[Code.PARAMERR])
        dict_data = json.loads(json_data.decode('utf8'))

        # 2.校验参数
        form = RegisterForm(data=dict_data)
        if form.is_valid(): # 判断参数是否符合验证
            # 3.存入数据到mysql数据库
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            mobile = form.cleaned_data.get('mobile')

            user = Users.objects.create_user(
                username=username,password=password,mobile=mobile)
            # create_use这个方法会把password(密码)加密存入数据库

            login(request,user) # auth系统实现登录session状态保持
            # 相当于 request.session['username']=username
            # 注册成功后直接登录账号

            # 4.返回给前端
            return to_json_data(errmsg="恭喜您，注册成功！")

        else: # form表单form.is_valid()验证出错的时候 定义一个错误信息列表
            err_msg_list = []
            for item in form.errors.get_json_data().values():
                err_msg_list.append(item[0].get('message'))
                # print(item[0].get('message'))   # for test
            err_msg_str = '/'.join(err_msg_list)  # 拼接错误信息为一个字符串

            return to_json_data(errno=Code.PARAMERR, errmsg=err_msg_str)


# 登陆的视图类
class LoginView(View):
    """"/login/"""
    # 一般我们会在类视图开始的地方写一些注释
    # 类视图中会先写是哪个url路径来访问这个类视图
    def get(self, request):
        return render(request, 'users/login.html')

    # 思考 1.发送的参数 登录的用户账号 密码 记住我 2.请求方式 POST
    # 3.提交参数的方式 ajax提交 4.获取数据 校验数据
    # 校验 1.用户账号 输入的是手机号还是用户名 格式是否正确 是否为空
    # 2. 账户名和密码和数据库中的数据一致

    def post(self,request):
        # 步骤：1.获取参数
        json_data = request.body
        if not json_data:
            return to_json_data(errno=Code.PARAMERR,
                                errmsg=error_map[Code.PARAMERR])
        dict_data = json.loads(json_data.decode('utf-8'))
        # 2.校验参数
        form = LoginForm(data=dict_data,request=request)
        # 传递request=request是因为我把login登录方法写在了form表单中需要request参数
        if form.is_valid(): # 判断表单验证是否成功
            # # 下面注释的是把login登录的方法写在视图类中模式
            # user_info = form.cleaned_data.get('user_account')
            # user = Users.objects.filter(Q(mobile=user_info) |
            #                             Q(username=user_info)).first()
            # login(request,user)
            # 3.返回前端
            return to_json_data(errmsg="恭喜您，登录成功！")
        else:
            # 定义一个错误信息列表
            err_msg_list = []
            for item in form.errors.get_json_data().values():
                err_msg_list.append(item[0].get('message'))
            err_msg_str = '/'.join(err_msg_list)  # 拼接错误信息为一个字符串
            # 3.返回前端
            return to_json_data(errno=Code.PARAMERR, errmsg=err_msg_str)


# 登出的视图类
class LogoutView(View):
    """/logout/"""
    def get(self, request):
        logout(request)
# logout(request)函数是根据浏览器的sessionid对数据库中 保存的session的信息进行删除数据
# logout(request) 相当于 request.session.flush() 删除当前会话数据并删除会话的cookie
        return redirect(reverse('news:index'))